package com.newx.file.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.newx.file.handler.NewxFileException;
import com.newx.file.param.AliyunFileUploadParam;
import com.newx.file.param.LocalFileUploadParam;
import com.newx.file.param.TencentFileUploadParam;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * @Classname FileUploadUtils
 * @Description TODO 文件上传工具类
 * @Date 2023/11/22 11:37
 * @Created by yxl
 */
@Slf4j
@Data
public class FileUploadUtil {

    public static String uploadLocalFile(LocalFileUploadParam param){
        String path = "";
        String orgName = "";
        String prefixName = "";
        String suffixName = "";
        String fileName = "";
        String savePath = "";
        String localPath = "";
        String filePath = param.getFilePath();
        String fileUrlPrefix = param.getFileUrlPrefix();
        MultipartFile file = param.getFile();
        String bucket = param.getBucket();
        try {
            String format = DateUtil.format(new Date(), "yyyy/MM/dd");
            // 上传的图片全部保存在 "E://upload//avatar//" 目录下
            filePath = filePath + "/"+bucket+"/" + format;
            File newFile = new File(filePath);
            if (!newFile.exists()) {
                // 创建完整的目录
                FileUtil.mkdir(newFile);
            }
            // 获取文件原始名(包含后缀名)
            orgName = file.getOriginalFilename();
            // 获取文件名（不包括后缀）
            prefixName = orgName.substring(0, orgName.lastIndexOf("."));
            // 获取文件后缀名
            suffixName = orgName.substring(orgName.lastIndexOf("."));
            // 这是处理后的新文件名
            // 示例：avatar.123.png，经过处理后得到：avatar.123_1661136943533.png
            fileName = IdUtil.randomUUID() + suffixName;
            savePath = newFile.getPath() + File.separator + fileName;
            File saveFile = new File(savePath);
            // 将上传的文件复制到指定目录
            FileCopyUtils.copy(file.getBytes(), saveFile);

            // 返回给前端的图片保存路径；前台可以根据返回的路径拼接完整地址，即可在浏览器上预览该图片
            path = filePath + File.separator + fileName;
            if (path.contains("\\")) {
                path = path.replace("\\", "/");
            }
            localPath = path;
            if(System.getProperty("os.name").contains("Windows")){
                path = path.substring(3);
            }
            if(System.getProperty("os.name").contains("Linux")){
                path = path.substring(1);
            }
        } catch (IOException e) {
            throw new NewxFileException("文件上传异常");
        }
//        FileResultVo vo = new FileResultVo();
//        vo.setDownloadAddress(fileUrlPrefix + path)
//                .setStorageAddress(localPath);
        return fileUrlPrefix + "/" + path;
    }

    /**
     * 上传文件到阿里云
     * @param file 文件
     * @return
     */
    public static String uploadAliyunFile(AliyunFileUploadParam param) {
        // 获取文件原始名(包含后缀名)
        String orgName = param.getFile().getOriginalFilename();
        // 获取文件名（不包括后缀）
        String prefixName = orgName.substring(0, orgName.lastIndexOf("."));
        // 获取文件后缀名
        String suffixName = orgName.substring(orgName.lastIndexOf("."));
        // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        StringBuffer fileUrl = new StringBuffer();
        String fileName = IdUtil.randomUUID() + suffixName;
        fileUrl.append(param.getPackagePath() +"/" + DateUtil.format(new Date(), "yyyy/MM/dd") + "/" + fileName);
        try {
            return AliyunOssUtil.uploadAliyunFileConfig(param.getFile().getInputStream(), param.getAccessKeyId(),
                    param.getAccessKeySecret(), param.getDomain(), param.getEndpoint(),
                    param.getBucket(), fileUrl.toString());
        } catch (IOException e) {
            throw new NewxFileException(e.getMessage());
        }
    }

    /**
     * 上传文件到腾讯云
     * @param file 文件
     * @return
     */
    public static String uploadTencentFile(TencentFileUploadParam param) {
        // 获取文件原始名(包含后缀名)
        String orgName = param.getFile().getOriginalFilename();
        // 获取文件名（不包括后缀）
        String prefixName = orgName.substring(0, orgName.lastIndexOf("."));
        // 获取文件后缀名
        String suffixName = orgName.substring(orgName.lastIndexOf("."));
        // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        StringBuffer fileUrl = new StringBuffer();
        String fileName = IdUtil.randomUUID() + suffixName;
        fileUrl.append(param.getPackagePath() +"/" + DateUtil.format(new Date(), "yyyy/MM/dd") + "/" + fileName);
        try {
            return TencentCosUtil.uploadFileByToken(param.getFile().getInputStream(), fileUrl.toString(), param.getBucketName());
        } catch (Exception e) {
            throw new NewxFileException(e.getMessage());
        }
    }
}
